<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>

    <script>

        function sum(a, b ,c , d){
            return a + b + c + d 
        }

        function fn(a) {
            return function(b) {
                return function(c) {
                    return function(d) {
                        return a + b + c + d 
                    }
                }
            }
        }

        // 柯理化函数  原本的这个参数的个数必须是确定的


        // 封装一个函数，实现柯理化的函数

        // function curry() {}

        // curry(sum)(1)(2)(3)(4)

        // let res = curry(sum) ;
        // res(1)(2)(3)(4)

        // let res = curry(sum)(1) ;
        // res(2)(3)(4)

        // let res = curry(sum)(1)(2) ;   // res 
        // let res2 = res(3)(4) ;   // res2 求和的结果

        

        // 分析地址栏  http  域名  端口   路径  
        // https://www.baidu.com:80/html/cart.html


        function myLocation(protocol , hostname , port , pathname) {
            return protocol + '://' + hostname + ':' + port + pathname 
        }


        // console.log(myLocation('http' , 'www.jd.com' , '80' , '/html/index.html'));


        // let res = myLocation('http' , 'www.jd.com' , '80') ;

        // res('/html/index.html')

        // res('/html/cart.html')

        // ...




        // curry(myLocation)('http' , 'www.jd.com' , '80')('/html/cart.html')

        // curry(myLocation)('http')()('/html/cart.html')

        // curry(myLocation , 'http' , 'www.jd.com' , '80' , '/html/index.html')

        // 收集原来的那个功能函数的参数的个数
        //     如果参数够了  就直接调用这个功能函数
        //     如果参数不够  就继续收集

        function curry(fn , ...arr) {   // ...arr 初始化传参
            // console.log(fn.length);  // 拿到原本的功能函数的形参个数
            // console.log(arr);  
            const len = fn.length ;

            return function(...arr2) {   // 返回一个接收余下的参数的函数
                // 判断参数是否足够   arr+arr2的参数
                const arr3 = [...arr , ...arr2] ;
                if(arr3.length === len) {
                    // 参数如果已经够了
                    return fn(...arr3) ;
                } else {
                    return curry(fn , ...arr3)
                }
            }

        }


        // console.log(curry(sum)(1)(2)(3)(4));
        console.log(curry(sum ,1 , 2)(1)(2));


        // let res = curry(myLocation , 'http' , 'www.jd.com' , '80') ;

        // console.log(res('/html/cart.html'));

        // console.log(res('/html/goodsList.html'));

        let res = curry(myLocation)('https')('www.mi.com')(80)('/index.html') ;
        console.log(res);




        // function f(a,b) {}

        // console.log(f.length);   // 形参的个数



        // document.onclick = pathnameFn('/list.html')

        // document.onclick = pathnameFn('/cart.html')


    </script>
    
</body>
</html>